package com.bigmodel.baidu;

import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.http.HttpRequest;
import cn.hutool.http.HttpUtil;
import cn.hutool.json.JSONArray;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

public class Chatglm2 {


    public static String chat(String prompt){
        String url = "http://8.130.140.181:8000/v1/chat/completions";

        Map<String,Object> params = new HashMap<>();
        List<Map<String,String>> messages = new ArrayList<>();
        
        Map<String,String> messageItem = new HashMap<>();
        messageItem.put("role","user");
        messageItem.put("content",prompt);
        messages.add(messageItem);
        params.put("messages",messages);
        params.put("temperature",0.01);
        params.put("top_p",0.7);
        params.put("max_tokens",2048);
        params.put("stream",false);
        params.put("model","chatglm2");

        HttpRequest reuqest = HttpUtil.createPost(url);
        Map<String,String> headers = new HashMap<>();
        headers.put("Content-Type","application/json");
        reuqest.addHeaders(headers);
        reuqest.body(JSONUtil.toJsonStr(params));


        String response = reuqest.execute().body();

        if(ObjectUtil.isNotEmpty(response)){
            try {
                JSONObject jsonObject = JSONUtil.parseObj(response);
                JSONArray choices = jsonObject.getJSONArray("choices");
                JSONObject messageObject = choices.getJSONObject(0).getJSONObject("message");
                String content = messageObject.getStr("content");
                return content;
            }catch (Exception e){
            }
        }
        return null;
    }



    public static String chatList(List<Map<String,String>> messages){

        String url = "https://aip.baidubce.com/rpc/2.0/ai_custom/v1/wenxinworkshop/chat/eb-instant?access_token=" ;

        Map<String,Object> params = new HashMap<>();
        params.put("messages",messages);
        params.put("temperature",0.1);

        HttpRequest reuqest = HttpUtil.createPost(url);
        Map<String,String> headers = new HashMap<>();
        headers.put("Content-Type","application/json");
        reuqest.addHeaders(headers);
        reuqest.body(JSONUtil.toJsonStr(params));

        //System.out.println(prompt);
        //System.out.println("---------------------------divider---------------------------");

        String response = reuqest.execute().body();

        if(ObjectUtil.isNotEmpty(response)){
            return JSONUtil.parseObj(response).getStr("result");
        }

        return null;
    }


    public static void main(String[] args) {
        String chat = Chatglm2.chat("你好,帮我查下中国10大热门网站");
        System.out.println(chat);
    }


    public static String chatMock(String questionContent) {


        {
            double similar = StrUtil.similar(questionContent, "你是一个BES故障处理专家，有一个故障要处理，当前故障的背景信息如下:\n" +
                    "\"\"\"\n" +
                    "故障描述：\n" +
                    "\n" +
                    "\n" +
                    "工具列表：\n" +
                    "工具1: 查询应用实例工具。// 查看应用实例名称。参数: \"systemName\"。\n" +
                    "工具2: 查询应用实例状态工具。// 查询应用实例的状态，参数:\"name\"\n" +
                    "工具3: 重启应用实例工具。// 重启应用实例，参数:\"name\"\n" +
                    "工具4: 查询数据库工具。// 查看数据库名称，参数:\"name\"\n" +
                    "工具5: 查询数据库状态工具。// 查询数据库的状态，参数:\"name\"\n" +
                    "工具6: 重启数据库工具。// 重启数据库，参数:\"name\"\n" +
                    "工具7: 结束工具。// 结束流程\n" +
                    "\n" +
                    "已知信息：\n" +
                    "工具使用规则:如果使用\"查询应用实例工具\"返回应用实例为空则使用\"结束工具\"结束流程,如果使用\"查询应用实例工具\"返回应用实例不为空则使用\"查询应用实例状态工具\"查询应用实例的状态\n" +
                    "我使用查询应用实例工具得到结果：查询应用实例名称列表接口返回结果为应用实例名称列表，即[\"实例1\", \"实例2\"]。\n" +
                    "\"\"\"\n" +
                    "\n" +
                    "分析故障，选择工具列表中的工具，并给出任务描述，提取准确的输入参数，按照以下json格式返回：\n" +
                    "{\n" +
                    "\"任务描述\": \"选择工具列表中的某一工具并给出工具的注释\",\n" +
                    "\"工具\": \"工具名称\",\n" +
                    "\"输入\": {\"工具参数\": \"参数值\"}\n" +
                    "}");
            if (similar > 0.9d) {

                String result = "[{\n" +
                        "\"任务描述\": \"使用查询应用实例状态工具,查询应用实例的状态\",\n" +
                        "\"工具\": \"查询应用实例状态工具\",\n" +
                        "\"输入\": {\"name\": \"实例1\"}\n" +
                        "}]";

                return result;
            }
        }


        {
            double similar = StrUtil.similar(questionContent, "你是一个BES故障处理专家，有一个故障要处理，当前故障的背景信息如下:\n" +
                    "\"\"\"\n" +
                    "故障描述：\n" +
                    "CRM系统成功率低于100%\n" +
                    "\n" +
                    "工具列表：\n" +
                    "工具1: 查询应用实例工具。// 查看应用实例名称。参数: \"systemName\"。\n" +
                    "工具2: 查询应用实例状态工具。// 查询应用实例的状态，参数:\"name\"\n" +
                    "工具3: 重启应用实例工具。// 重启应用实例，参数:\"name\"\n" +
                    "工具4: 查询数据库工具。// 查看数据库名称，参数:\"name\"\n" +
                    "工具5: 查询数据库状态工具。// 查询数据库的状态，参数:\"name\"\n" +
                    "工具6: 重启数据库工具。// 重启数据库，参数:\"name\"\n" +
                    "工具7: 结束工具。// 结束流程\n" +
                    "\n" +
                    "已知信息：\n" +
                    "工具使用规则:如果使用\"查询应用实例状态工具\"返回应用实例状态为异常则使用\"重启应用实例工具\"重启应用实例,如果使用\"查询应用实例状态工具\"返回应用实例状态为正常则使用\"查询数据库工具\"查看数据库名称\n" +
                    "我使用查询应用实例状态工具得到结果：查询应用实例的状态，API返回结果为成功，应用实例名称是\"实例1\"，状态为\"success\"。\n" +
                    "\n" +
                    "\"\"\"\n" +
                    "\n" +
                    "分析故障，选择工具列表中的工具，并给出任务描述，提取准确的输入参数，按照以下json格式返回：\n" +
                    "{\n" +
                    "\"任务描述\": \"选择工具列表中的某一工具并给出工具的注释\",\n" +
                    "\"工具\": \"工具名称\",\n" +
                    "\"输入\": {\"工具参数\": \"参数值\"}\n" +
                    "}");
            if (similar > 0.9d) {

                String result = "[{\n" +
                        "\"任务描述\": \"使用查询数据库工具,查看数据库名称\",\n" +
                        "\"工具\": \"查询数据库工具\",\n" +
                        "\"输入\": {\"systemName\": \"CRM系统\"}\n" +
                        "}]";

                return result;
            }
        }



        return null;
    }

}
